加密与解密 第一篇 基础篇

第一章 基础知识

1.1 文本字符

1.1.1 字节存储顺序

  • Little-Encoding :Intel体系芯片

高字节存入低地址,低字节存入高地址

  • Big-Encoding:RSIC架构CPU

高字节存入高地址,低字节存入低地址

1.1.2 ASCII与UNICODE编码

  • ASCII
ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符
0 NUT 32 (space) 64 @ 96
1 SOH 33 ! 65 A 97 a
2 STX 34 " 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 , 71 G 103 g
8 BS 40 ( 72 H 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 + 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DCI 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 TB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 / 124 |
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 `
31 US 63 ? 95 _ 127 DEL
  • unicode

所有字符都是16位

1.2 操作系统

1.2.1 win api

  • 动态链接库

  • Kernel

    核心功能

    • 进程线程
    • 内存管理
    • 文件访问
  • User

    用户接口

    • 键盘和鼠标输入
    • 窗口和菜单管理
  • GDI

    图形设备接口

    • 屏幕和打印机显示文本和图像

1.2.2 常用win32 api 函数

hmemcpy
  • 这是一个Win16 API函数,位于位的KRNL386.EXE链接库里。是系统底层的东西,没有特殊需要,一般不直接调用

  • 功能:执行的操作很简单,只是将内存中的一块数据COPY到另一个地方

  • 在Windows 9x中,Win32函数调用通过转换层转换为Win16函数调用,所以Windows 9x底层频繁的调用hmemcpy这个位的函数来拷贝数据

  • 它经常被解密者作为断点拦截数据,别称“万能断点”

c void hmemcpy( void _huge *hpvDest, //目地数据地址 const void _huge *hpvSource, //源数据地址 long cbCopyn //数据大小 );

GetWindowText
  • 此函数在USER32.DLL用户模块中,它的作用是取得一个窗体的标题文字,或者一个文本控件的内容

  • 如果成功返回文本长度;失败则返回零值

  • ANSI版是GetWindowTextA Unicode版是GetWindowTextW

```c int GetWindowText( HWND hWnd, //窗口或文件空间句柄 LPTSTR lpString, //缓冲区地址 int nMaxCount //复制的最大字符数 );

```

GetDlgItem
  • 此函数在USER32.DLL用户模块中,它的作用是获取指定对话框的句柄
  • 如果成功返回对话框的句柄;失败则返回零
HWND GetDlgItem(

    HWND hDlg,                 //对话框句柄

    int nIDDlgItem             //控件标识
                  );
GetDlgItemText
  • 此函数在USER32.DLL用户模块中,它的作用是获取对话框文本
  • 如果成功返回文本长度;失败则返回零
  • ANSI版是GetDlgItemTextA Unicode版是GetDlgItemTextW
UINT GetDlgItemText(

    HWND hDlg,                 //对话框句柄      

    int nIDDlgItem,            //空间标识(ID号)

    LPTSTR lpString,       //文本缓冲区指针

    int nMaxCount         //字符缓冲区的长度

                          );
GetDlgItemInt
  • 此函数在USER32.DLL用户模块中,它的作用是获取对话框整数值
  • 如果成功,lpTranslated被设置为TRUE
UINT GetDlgItemInt(

    HWND hDlg,                 //对话框句柄

    int nIDDlgItem,            //空间标识

    BOOL *lpTranslated,        //接受成功/失败指示的指针

    BOOL bSigned          //指定是有符号数还是无符号数

                     )
MessageBox
  • 此函数在USER32.DLL用户模块中,创建和显示信息框
  • ANSI版是MessageBoxA Unicode版是MessageBoxW
int MessageBox(

    HWND hDlg,                 //父窗口句柄

    LPCTSTR lpText,            //消息框文本地址

    LPCTSTR lpCaption,     //消息框标题地址

    UINT uType                 //消息框样式

                );
GetDlgItemText
  • 是根据控件ID来取文字,GetWindowText是根据控件句柄或者指针来取

1.2.3 什么是句柄

  • windows标识
  • 由应用程序建立或使用的对象所使用的唯一的整数值(32位)

1.2.4 windows 9.x 和unicode

  • 大部分的32位函数只是调用了16位版本
  • 有少量的unicode版本的函数
  • MessageBox
  • 大部分的函数只有unicode的参数进入点,但其实并不将unicode码转成ascii,而是直接返回失败的消息

1.2.5 windows NT/2000/XP 与unicode

  • 内核只使用unicode

1.2.6 windows消息机制

  • windows应用程序之间、应用程序与windows系统之间的进行通信的手段

  • 两个队列

  • 系统消息队列

  • 应用程序消息队列

按消息到达的先后进行处理

  • 常用windows消息函数

  • SendMessage

将一条消息发送给某个函数

  • 返回值
    1. WM_COMMAND
    2. 用户从菜单或者按钮选择一条命令或者一个控件,发送给其父窗口
    3. 或者一个快捷键被释放时
    4. 应用程序处理这条消息,则返回0
    5. WM_DESTORY
    6. 一个窗口被破坏时发送
    7. WM_GETTEXT
    8. 将程序提供的文本拷贝到一个呼叫程序提供的缓冲区
    9. WM_QUIT
    10. 当应用程序调用PostQuitMessage函数
    11. WM_LEFTBUTTONDOWN
    12. 光标在一个窗口的客户区,用户按下了鼠标左键
    13. 未被捕获,就发送给光标下的窗口

1.3 保护模式

  • 模式
  • 实模式
  • 保护模式
  • 虚拟x86模式

1.3.1 虚拟内存

  • 实模式
  • 寻址方式:段基址+段偏移
  • 段大小:64K
  • 所有段可读写,只有代码段可执行
  • 保护模式
  • 段选择子+段偏移
  • 段选择子:不参与选址,只是GDT或者LDT的指针
  • 不同的段寄存器有不同的属性
    • 执行
    • 特选级
  • win32平坦内存模式
  • 每个进程有自己的虚拟空间,32位进程位4GB
  • 程序的代码不区分代码段和数据段
  • 4GB中,2GB给应用程序(也可达到3G),2GB给操作系统
  • 操作系统和系统DLL所有时间片都必须映射
  • 用户exe只在属于自己的时间片映射
  • 用户DLL有选择的映射
  • 虚拟内存的实现方法:
    1. 程序启动,分配2GB虚拟地址
    2. 应用程序代码映射到虚拟内存某个位置
    3. 使用了DLL,则也映射该DLL
    4. 数据、堆栈等也进行映射
    5. 程序从虚拟地址执行

1.3.2 保护模式的权限级别

  • 权限级别

4个等级:0,1,2,3

  • 0级

  • 执行所有指令、访问所有数据

  • 操作系统核心层运行在0级
  • hal.dll(硬件抽象层)
  • ntoskrnl.exe的上层

  • 3级

  • 指令有限、数据有限

  • win32子系统运行在3级

    • kernel.dll
    • user32.dll
    • gdi32.dll
  • ntdll.dll

    用户层导出并且可以调用的函数接口

  • 用户的应用程序

1.4 PE格式

区块
  • .txt 全部指令代码
  • .rdata 运行期的只读数据
  • .data 初始化数据块
  • .idata 其他外来DLL的函数和数据,输入表
  • .rsrc 模块的全部资源:图标、菜单、位图
  • 磁盘文件和内存中的结构一致
相关名词
  • 入口点

程序执行时第一行代码的位置

  • 文件偏移地址

文件在磁盘上时,各数据的地址

  • 虚拟地址

  • 内存偏移地址

  • 格式:段:偏移量(e.g 0167:00401000)

    • cs段选择器,段选择子:0167
    • 虚拟地址:00401000
  • 基地址 Image Base

  • 文件执行时被映射到指定内存的地址

  • 有pe文件决定
  • vc++建立的exe
    • exe基地址:0040000h
    • dll基地址: 1000000h